package com.ophiux.utils.parser.json;

import java.lang.reflect.Type;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class JsonUtils {

	private JsonUtils() {
	}

	private static JsonUtils istance;

	public static void main(String[] args) {
		try {
			Integer.parseInt("sss");
		} catch (Exception e) {
			System.out.println(JsonUtils.getIstance().toJson(e));
		}
	}

	public static JsonUtils getIstance() {
		return (istance == null) ? (istance = new JsonUtils()) : istance;
	}

//	protected Logger logger = LoggerFactory.getLogger(this.getClass());

	private final static Gson _gson = new GsonBuilder().serializeNulls().create();
	private final static Gson _gson2 = new GsonBuilder().disableHtmlEscaping().create();

	/**
	 * 
	 * 描述 :Json数据转为实体类</br>
	 * </br>
	 * <h1>创 建 人: wujw<br>
	 * </h1> 创建日期: 2015-12-15下午7:12:51<br>
	 * 
	 * @param json
	 * @param callback
	 * @return
	 */
	public static <T> T toEntity(String json, TypeObtainCallback callback) {
		T t = null;
		Type typeOfT = null;
		try {
			typeOfT = callback.getObtainType();
			t = _gson.fromJson(json, typeOfT);
		} catch (Exception e) {
			e.printStackTrace();
			// log.info("json解析错误，json = {"+json+"}，class = {},Exception = {}\n",typeOfT,e);
		}

		return t;

	}

	/**
	 * 
	 * 描述 :</br>
	 * </br>
	 * <h1>创 建 人: wujw<br>
	 * </h1> 创建日期: 2015-12-28下午2:49:34<br>
	 * 
	 * @param json
	 * @param type
	 * @return
	 */
	public <T> T toEntity(String json, Type type) {
		T t = null;
		Type typeOfT = type;
		try {
			t = _gson.fromJson(json, typeOfT);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			// log.info("json解析错误，json = {"+json+"}，class = {},Exception = {}\n",typeOfT,e);
		}
		return t;

	}

	/**
	 * 
	 * 描述 :</br>
	 * </br>
	 * <h1>创 建 人: wujw<br>
	 * </h1> 创建日期: 2015-12-28下午2:49:34<br>
	 * 
	 * @param json
	 * @param type
	 * @return
	 */
	public static <T> T toEntity(String json, Class<T> classOfT) {
		T t = null;
		try {
			// log.info("传入的json==="+json);
			t = _gson.fromJson(json, classOfT);
		} catch (Exception e) {
			// logger.error("解析json异常==="+json);
			e.printStackTrace();
			// log.info("json解析错误，json = {"+json+"}，class = {},Exception = {}\n",toJson(e));
		}

		return t;

	}

	/**
	 * 
	 * 描述 :转JSON</br>
	 * </br>
	 * <h1>创 建 人: wujw<br>
	 * </h1> 创建日期: 2015-12-28下午2:50:26<br>
	 * 
	 * @param data
	 * @return
	 */
	public static String toJson(Object data) {
		return _gson.toJson(data);
	}

	/**
	 * 
	 * 
	 * 
	 * 
	 * 文件名称:com.ophiux.mamp.service.extract.base<br>
	 * 内容摘要:获取请求参数类型回调<br>
	 * <h1>创 建 人: wujw<br>
	 * </h1> 创建日期: 2015-12-15下午6:29:51<br>
	 * 修改记录1: // 修改历史记录，包括修改日期、修改者及修改内容<br>
	 * 修改日期： 版 本 号： 修 改 人： 修改内容： 修改记录2：…
	 *
	 */
	public interface TypeObtainCallback {
		/**
		 * 
		 * 描述 :获取参数类型，</br>
		 * 目前仅作用于官网服务请求返回参数Data字段类型，</br>
		 * </br>
		 * <h1>创 建 人: wujw<br>
		 * </h1> 创建日期: 2015-12-15下午6:25:02<br>
		 * 
		 * @return
		 */
		public Type getObtainType();

	}

	/**
	 * 
	 * 描述 :转JSON(去掉)</br>
	 * </br>
	 * <h1>创 建 人: xw<br>
	 * </h1> 创建日期: 2016年9月2日16:08:37<br>
	 * 
	 * @param data
	 * @return
	 */
	public String toJson2(Object data) {
		return _gson2.toJson(data);
	}
}
